package com.zz.generator.util;

import org.apache.commons.lang3.StringUtils;

public class TableCodeGeneratorUtil {

    public static String generateEntityName(String tableName) {
        return generateEntityName(tableName, null, null);
    }

    public static String generateEntityNameWithPrefix(String tableName, String prefix) {
        return generateEntityName(tableName, prefix, null);
    }

    public static String generateEntityNameWithSuffix(String tableName, String suffix) {
        return generateEntityName(tableName, null, suffix);
    }

    /**
     * 生成 Entity 类名
     *
     * @return Entity 类名（如 "UserInfo"）
     */
    public static String generateEntityName(String tableName, String prefix, String suffix) {
        return generateClassName(tableName, prefix, suffix);
    }

    public static String generateMapperName(String tableName) {
        return generateMapperName(tableName, null, null);
    }

    public static String generateMapperNameWithPrefix(String tableName, String prefix) {
        return generateMapperName(tableName, prefix, null);
    }

    public static String generateMapperNameWithSuffix(String tableName, String suffix) {
        return generateMapperName(tableName, null, suffix);
    }

    /**
     * 生成 Mapper 类名
     *
     * @return Mapper 类名（如 "UserInfoMapper"）
     */
    public static String generateMapperName(String tableName, String prefix, String suffix) {
        String className = generateClassName(tableName, prefix, suffix);
        // 拼接 Mapper 后缀
        return className + "Mapper";
    }

    public static String generateXmlName(String tableName) {
        return generateXmlName(tableName, null, null);
    }

    public static String generateXmlNameWithPrefix(String tableName, String prefix) {
        return generateXmlName(tableName, prefix, null);
    }

    public static String generateXmlNameWithSuffix(String tableName, String suffix) {
        return generateXmlName(tableName, null, suffix);
    }

    /**
     * 生成 XML 文件名
     *
     * @return XML 文件名（如 "UserInfoMapper.xml"）
     */
    public static String generateXmlName(String tableName, String prefix, String suffix) {
        String className = generateClassName(tableName, prefix, suffix);
        // 拼接 XML 后缀
        return className + "Mapper.xml";
    }

    public static String generateControllerName(String tableName) {
        return generateControllerName(tableName, null, null);
    }

    public static String generateControllerNameWithPrefix(String tableName, String prefix) {
        return generateControllerName(tableName, prefix, null);
    }

    public static String generateControllerNameWithSuffix(String tableName, String suffix) {
        return generateControllerName(tableName, null, suffix);
    }

    /**
     * 生成 Controller 类名
     *
     * @return Controller 类名（如 "UserInfoController"）
     */
    public static String generateControllerName(String tableName, String prefix, String suffix) {
        String className = generateClassName(tableName, prefix, suffix);
        // 拼接 Controller 后缀
        return className + "Controller";
    }

    public static String generateDtoName(String tableName) {
        return generateDtoName(tableName, null, null);
    }

    public static String generateDtoNameWithPrefix(String tableName, String prefix) {
        return generateDtoName(tableName, prefix, null);
    }

    public static String generateDtoNameWithSuffix(String tableName, String suffix) {
        return generateDtoName(tableName, null, suffix);
    }

    /**
     * 生成 Dto 类名
     *
     * @return Dto 类名（如 "UserInfoDto"）
     */
    public static String generateDtoName(String tableName, String prefix, String suffix) {
        String className = generateClassName(tableName, prefix, suffix);
        // 拼接 Dto 后缀
        return className + "Dto";
    }

    public static String generateServiceName(String tableName) {
        return generateServiceName(tableName, null, null);
    }

    public static String generateServiceNameWithPrefix(String tableName, String prefix) {
        return generateServiceName(tableName, prefix, null);
    }

    public static String generateServiceNameWithSuffix(String tableName, String suffix) {
        return generateServiceName(tableName, null, suffix);
    }

    /**
     * 生成 Service 类名
     *
     * @return Service 类名（如 "UserInfoService"）
     */
    public static String generateServiceName(String tableName, String prefix, String suffix) {
        String className = generateClassName(tableName, prefix, suffix);
        // 拼接 Service 后缀
        return className + "Service";
    }

    /**
     * 生成类名
     *
     * @param tableName 表名（如 "user_info" 或 "tbl_user_info" 或 "user_info_t"）
     * @param prefix    表名前缀（如 "tbl_"）
     * @param suffix    表名后缀（如 "_t"）
     * @return 类名（如 "UserInfo"）
     */
    public static String generateClassName(String tableName, String prefix, String suffix) {
        if (StringUtils.isBlank(tableName)) {
            throw new IllegalArgumentException("Table name cannot be blank");
        }

        // 清理前缀
        String cleanedTableName = StringUtils.isBlank(prefix)
                ? tableName
                : StringUtils.removeStart(tableName, prefix);

        // 清理后缀
        cleanedTableName = StringUtils.isBlank(suffix)
                ? cleanedTableName
                : StringUtils.removeEnd(cleanedTableName, suffix);

        // 分割下划线并首字母大写
        String[] parts = cleanedTableName.split("_");
        StringBuilder className = new StringBuilder();
        for (String part : parts) {
            if (StringUtils.isNotBlank(part)) {
                className.append(capitalizeFirstLetter(part));
            }
        }
        return className.toString();
    }

    /**
     * 首字母大写（空字符串返回空）
     *
     * @param str 输入字符串
     * @return 首字母大写后的字符串
     */
    public static String capitalizeFirstLetter(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        }
        return str.substring(0, 1).toUpperCase() + str.substring(1).toLowerCase();
    }

    /**
     * 首字母小写（空字符串返回空）
     *
     * @param str 输入字符串
     * @return 首字母小写后的字符串
     */
    public static String uncapitalizeFirstLetter(String str) {
        if (StringUtils.isBlank(str)) {
            return "";
        }
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }

    /**
     * 将大驼峰格式的字符串转换为连字符分隔的小写格式
     *
     * @param camelCase 输入的大驼峰字符串（如 "AuthUser"）
     * @return 转换后的连字符格式字符串（如 "auth-user"）
     */
    public static String camelToHyphen(String camelCase) {
        if (camelCase == null || camelCase.isEmpty()) {
            return camelCase;
        }

        // 1. 在非首字母的大写字母前插入连字符，并转为小写
        String hyphenated = camelCase
                .replaceAll("([A-Z])", "-$1") // 在大写字母前插入连字符
                .toLowerCase();              // 转为小写

        // 2. 合并连续的连字符（如 "xml-http-request" → "xml-http-request"）
        hyphenated = hyphenated.replaceAll("-+", "-");

        // 3. 去除首尾多余的连字符
        hyphenated = hyphenated.replaceAll("^-|-$", "");

        return hyphenated;
    }

}
